草庐IT

Java getNodeName 和命名空间

全部标签

c++ - make_pair 命名空间污染

在我最近编写的代码中,我注意到一个奇怪的行为。当我使用第一个参数为std::pair的make_pair时,make_pair变得“神奇地”在命名空间中可用(我不必使用std::限定符)#includeintmain(){inti1=2;inti2=10;inti3=0;//constructingapairusingstd::make_pair,everything'sokaystd::pairkey=std::make_pair(i1,i2);//here,whyismake_pairsuddenlymagicallyavailablewithoutthe//std::namesp

c++ - 为什么 std::generate 可以在没有命名空间限定符的情况下访问?

这样编译正常正常吗?#include#includeintmain(){std::vectorbuf;generate(buf.begin(),buf.end(),[]{return0;});}(注意generate()前面缺少的std::)是否在某处记录了此行为?还是我偶然发现了编译器或库错误?在我的例子中,Linux上的GCC5.3.0和Clang3.8.0;两者都使用libstdc++,所以可能是库错误? 最佳答案 这是允许的,主要是因为generate的参数在std中。代码如下namespaceFoo{structB{};v

c++ - 有没有办法警告我全局命名空间污染?

gcc(或任何其他编译器)是否有警告我全局命名空间污染的选项?我试图编译一个示例应用程序套件,但事实证明该示例的很多头文件都受到全局命名空间污染的困扰(在header中使用命名空间文件),因此MacOSX全局结构Rect变得不明确。我还尝试更改#include的顺序以在usingnamespace的雷区之前解析系统的Rect符号,但这导致一些符号最终没有解析。我之前使用谷歌搜索失败,虽然预感不好,如果存在这种警告选项,请给我信息。 最佳答案 我不知道gcc,但CLang有:defwarn_using_directive_in_hea

c++ - 命名管道,如何知道读取端要读取的确切字节数。 C++, Windows

我正在使用配置为将数据作为单字节流发送的命名管道在两个应用程序之间发送序列化数据结构。序列化数据的大小变化非常显着。在发送端,这不是问题,我可以调整要发送的字节数。如何将接收(读取)端的缓冲区设置为要读取的确切字节数?有没有办法知道发送(写入)端的数据有多大?我看过PeekNamedPipe,但该函数似乎对字节类型的命名管道毫无用处?lpBytesLeftThisMessage[out,optional]Apointertoavariablethatreceivesthenumberofbytesremaininginthismessage.Thisparameterwillbezer

C++ 命名空间别名和前向声明

我正在使用一个C++第三方库,该库将其所有类放在一个版本化的命名空间中,我们称它为tplib_v44。他们还定义了一个通用的命名空间别名:namespacetplib=tplib_v44;如果使用通用命名空间在我自己的.h文件中前向声明库的成员...namespacetplib{classSomeClassInTpLib;}...我在第三方库(稍后包含在我的.cpp实现文件中)的header上遇到编译器错误:errorC2386:'tplib':asymbolwiththisnamealreadyexistsinthecurrentscope如果我使用特定于版本的命名空间,那么一切正常

c++ - 如何让 Visual Studio 保持在 4GB 虚拟地址空间内

VisualStudiodevenv.exe进程是32位(evenwhenrunona64-bitOS),因此它不能使用超过4GB的虚拟内存。不幸的是,当我使用VisualStudio调试我的C++应用程序时,由于这个4GB的限制,我经常用完内存。例如,使用VMMap,下面显示了我在几个小时内导致崩溃的典型VisualStudio使用进度。如何让VisualStudio使用更少的内存,从而避免因它崩溃而浪费时间?VisualStudio通常使用超过3.5GB的虚拟地址空间吗?我正在使用VisualStudio2012,但我认为这个问题跨越不同的VS版本,因为VisualStudio20

c++ - 命名空间与类模板名称冲突 : different compiler behavior

不同的编译器showdifferentbehavior编译以下代码:namespaceN{namespaceFoo{templatestructFoo{};}}templateusingFoo=N::Foo::Foo;namespaceN{templatestructBar:Foo{};}intmain(){}测试的编译器及其编译标志:clang++5.0.0:-std=c++14-Wall-Wextra-Werror-pedantic-errorsg++7.2:-std=c++14-Wall-Wextra-Werror-pedantic-errorsvc++19.10.25017(V

c++ - "templating"命名空间

我想构建这样的东西:File1:templatenamespacemyNamespace{classmyClass1{myClass1(Vectorv){...}}}File2:templatenamespacemyNamespace{classmyClass2{myClass2(Vectorv){...}}}当然这是不可能的,因为你不能模板命名空间。相反,我可以使用结构而不是命名空间,但这样我就无法将命名空间函数分布到多个文件中。这样的问题有什么解决办法吗?PS:我知道我可以对类进行模板化,但是我必须在创建新类时指定要使用的vector类型。 最佳答案

从另一个命名空间内访问 C++ 全局命名空间

在下面的C++代码中,foobar首先为单个double参数定义,然后再次为类型为Foo的单个参数定义.两者都在全局命名空间中定义。在one命名空间中,定义了foobar的进一步重载,具有Bar类型的单个参数。从这个版本的foobar开始,使用double参数(42.0)对foobar的非限定调用将失败。对foobar的类似调用,这次使用(::)范围解析运算符限定,还使用​​double参数,但会成功。另一方面,使用类型为Foo的参数对foobar的非限定调用会成功。使用范围解析运算符限定的Foo参数调用foobar也会成功。为什么这两种情况的表现不同?我同时使用gcc4.7和clan

c++ - 非命名空间范围内的显式特化在 GCC 中无法编译

以下代码在Clang中编译但在GCC中不编译:templatestructWidget{templatevoidfoo(U){}templatevoidfoo(int*){}};根据C++标准([temp.expl.spec],第2段):Anexplicitspecializationmaybedeclaredinanyscopeinwhichthecorrespondingprimarytemplatemaybedefined这是GCC中的错误吗?如果是,我如何在其错误跟踪器中找到它?这是GCC的输出:prog.cc:13:14:error:explicitspecializatio